/**
 * 封装axios工具模块
 */
import axios from 'axios'
import { message } from 'antd'
import store from '@/store'
import { getToken } from './auth'
import {logoutAction} from '@/store/actions/user'
import { history } from '@/utils/history'

const http = axios.create({
  baseURL: '/api',
  timeout: 5000
})


// 添加请求拦截器
http.interceptors.request.use((config) => {
  // 注入带有token的请求头
  const { login } = store.getState()
  if (login.token) {
    config.headers['Authorization'] = `Bearer ${getToken()}`
  }
  return config
}, (error) => {
  return Promise.reject(error)
})

// 添加响应拦截器
http.interceptors.response.use((response) => {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么

    // token失效处理
    if(response?.data?.code === 401) {
      const {msg} = response.data
      // 登出action 删除token
      store.dispatch(logoutAction())
      // 跳转到登录页面
      history.push('/login')
      // 提示token失效错误信息
      window.location.reload()
      message.error(msg)
    }

  return response.data
}, (error) => {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么

  // 01. 处理网络异常状况，如果请求延迟，response为undefined
  if(!error.response) {
    message.error('网络异常,请稍后重试')
    return Promise.reject(error)
  }

  // 02.其他错误，提示错误信息
  message.error(error.message)
  return Promise.reject(error)
})

export default http